package com.preparation.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.preparation.domain.*;
import com.preparation.mapper.*;
import com.preparation.service.IPostService;
import org.apache.logging.log4j.util.Strings;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Service;
import javax.annotation.PostConstruct;
import java.time.Duration;
import java.time.Instant;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.util.Date;
import java.util.List;
import java.util.stream.Collectors;

@Service
public class PostServiceImpl extends ServiceImpl<PostMapper, Post> implements IPostService {

    // 热度衰减系数，值越大热度随时间衰减越快，可根据实际情况调整
    private static final double DECAY_RATE = 0.1;
    private static final int VIEW_WEIGHT = 2;
    private static final int LIKE_WEIGHT = 4;
    private static final int COMMENT_WEIGHT = 6;
    private static final int COLLECT_WEIGHT = 10;

    @Autowired
    private PostMapper postMapper;

    @Autowired
    private UserMapper userMapper;

    @Autowired
    private CategoryMapper categoryMapper;

    @Autowired
    private CollectionMapper collectionMapper;

//
//
//    //置顶  取消置顶
//    @Override
//    public Boolean sticky(Integer id) {
//        Post post = postMapper.selectById(id);
//        if (post.getIsSticky()==0){
//            return postMapper.updateIsSticky(id, 1) > 0;
//        }else{
//            return postMapper.updateIsSticky(id, 0) > 0;
//        }
//    }
//
//    //查询帖子列表
//    @Override
//    public List<Post> getAll(Post post) {
//        LambdaQueryWrapper<Post> qw = new LambdaQueryWrapper<>();
//
//        qw.orderByDesc(Post::getHeat);
//        qw.orderByDesc(Post::getCreateTime);
//
//        qw.eq(post.getIsSticky()!=null, Post::getIsSticky, post.getIsSticky());
//        qw.eq(post.getCategoryId()!=null && post.getCategoryId()>0, Post::getCategoryId, post.getCategoryId());
//        qw.eq(Post::getStatus, "通过");
//
//        List<Post> postList = postMapper.selectList(qw);
//
//        for (Post p : postList) {
//            User user = userMapper.selectById(p.getUserId());
//            p.setNickname(user.getNickname());
//            p.setRole(user.getRole());
//            p.setAvatar(user.getAvatar());
//            if (p.getCategoryId() > 0){
//                Category category = categoryMapper.selectById(p.getCategoryId());
//                p.setCategoryName(category.getCategoryName());
//            }else{
//                p.setCategoryName("全部");
//            }
//        }
//        return postList;
//    }
//
//    //根据id查询
//    public Post selectById(Integer id){
//        Post post = postMapper.selectById(id);
//        User user = userMapper.selectById(post.getUserId());
//        post.setNickname(user.getNickname());
//        post.setRole(user.getRole());
//        post.setAvatar(user.getAvatar());
//        if (post.getCategoryId() > 0){
//            Category category = categoryMapper.selectById(post.getCategoryId());
//            post.setCategoryName(category.getCategoryName());
//        }else{
//            post.setCategoryName("全部");
//        }
//        return post;
//    }
//
//    //添加
//    public Boolean addPost(Post post){
//        post.setCreateTime(new Date());
//        post.setStatus("待审核");
//        return postMapper.insert(post) > 0;
//    }
//
//    //增加浏览量
//    @Override
//    public Boolean addViews(Integer id) {
//        return postMapper.addViewsCount(id) > 0;
//    }
//
//    //修改帖子状态
//    @Override
//    public Boolean updateStatus(Post post) {
//        Post p = postMapper.selectById(post.getId());
//        if("通过".equals(post.getStatus())){
//            //更新热度
//            calculatePostHeat(p);
//        }else{
//            //热度清0
//            postMapper.updateHotValue(post.getId(),0);
//        }
//        return postMapper.updateStatus(post.getId(),post.getStatus()) > 0;
//    }
//
//    //查询我的发帖
//    @Override
//    public List<Post> getByUid(Integer userId) {
//        LambdaQueryWrapper<Post> qw = new LambdaQueryWrapper<>();
//
//        qw.eq(Post::getUserId, userId);
//        qw.orderByDesc(Post::getCreateTime);
//        List<Post> posts = postMapper.selectList(qw);
//
//        return posts;
//    }
//
//    //根据id删除  删除帖子同时删除点赞记录和收藏记录
//    public Boolean deleteById(Integer id){
//        //删除点赞信息
//        postLikeMapper.delete(new LambdaQueryWrapper<PostLike>().eq(PostLike::getPostId, id));
//        //删除收藏信息
//        collectionMapper.delete(new LambdaQueryWrapper<Collection>().eq(Collection::getPostId, id));
//        //删除帖子信息
//        return postMapper.deleteById(id) > 0;
//    }
//
//    //根据id更新帖子信息
//    @Override
//    public Boolean renewById(Post post) {
//        return postMapper.renewById(post) > 0;
//    }
//
//    //根据关键字搜索内容
//    public List<Post> getByKeyword(String keyword) {
//        LambdaQueryWrapper<Post> qw = new LambdaQueryWrapper<>();
//
//        // 查询 categoryName 包含关键字的 ID 列表
//        List<Category> categories = categoryMapper.selectList(
//                new LambdaQueryWrapper<Category>()
//                        .like(Category::getCategoryName, keyword)
//                        .select(Category::getId)
//        );
//        // 提取 ID 列表
//        List<Integer> categoryIds = categories.stream()
//                .map(Category::getId)
//                .collect(Collectors.toList());
//
//        //查询通过的帖子
//        qw.eq(Post::getStatus, "通过");
//        //帖子标题或内容或类别包含关键字
//        qw.and(wrapper ->
//                wrapper.like(Post::getTitle, keyword)
//                        .or()
//                        .like(Post::getContent, keyword)
//                        .or()
//                        // 如果 categoryIds 不为空，匹配 categoryId 在 categoryIds 列表中的数据
//                        .in(!categoryIds.isEmpty(), Post::getCategoryId, categoryIds)
//        );
//
//        //按热度和时间降序排序
//        qw.orderByDesc(Post::getHeat);
//        qw.orderByDesc(Post::getCreateTime);
//
//
//        List<Post> postList = postMapper.selectList(qw);
//
//        for (Post p : postList) {
//            User user = userMapper.selectById(p.getUserId());
//            p.setNickname(user.getNickname());
//            p.setRole(user.getRole());
//            p.setAvatar(user.getAvatar());
//            if (p.getCategoryId() > 0){
//                Category category = categoryMapper.selectById(p.getCategoryId());
//                p.setCategoryName(category.getCategoryName());
//            }else{
//                p.setCategoryName("全部");
//            }
//        }
//
//        return postList;
//    }
//
//    // 启动时执行一次计算热度的方法
//    @PostConstruct
//    public void calculatePostHeatOnStartup() {
//        calculatePostHeatForApprovedPosts();
//    }
//
//    // 定时任务方法，每隔1小时执行一次
//    @Scheduled(fixedRate = 3600000) // 3600000毫秒 = 1小时
//    public void scheduledCalculatePostHeat() {
//        calculatePostHeatForApprovedPosts();
//    }
//
//    // 计算所有已审核通过的帖子的热度
//    private void calculatePostHeatForApprovedPosts() {
//        LambdaQueryWrapper<Post> qw = new LambdaQueryWrapper<>();
//        qw.eq(Post::getStatus, "通过");
//        List<Post> allPosts = postMapper.selectList(qw);
//        //依次计算热度
//        for (Post post : allPosts) {
//            calculatePostHeat(post);
//        }
//    }
//
//    /**
//     * 计算帖子热度
//     * 公式：H = H0 * e^(-0.1 * Hours)
//     * 初始热度为100，热度系数为0.1，大概46小时热度为0
//     * 如果热度为0.2，大概24小时热度到0
//     *
//     * @param post  需要计算热度的帖子对象
//     */
//    public void calculatePostHeat(Post post) {
//        int views = post.getViewsCount();
//        int likes = post.getLikesCount();
//        int comments = post.getCommentsCount();
//        int collects = post.getCollectsCount();
//
//        // 先根据交互数据计算基础热度，不考虑时间衰减的情况
//        int baseHeat = 100 + views * VIEW_WEIGHT + likes * LIKE_WEIGHT + comments * COMMENT_WEIGHT + collects * COLLECT_WEIGHT;
//
//        // 获取当前时间与发布时间的时间差以小时为单位
//        LocalDateTime now = LocalDateTime.now();
//        // 将Date类型转换为Instant类型
//        Instant instant = post.getCreateTime().toInstant();
//        // 通过ZoneId指定时区，将Instant转换为LocalDateTime
//        LocalDateTime createTimeLdt = LocalDateTime.ofInstant(instant, ZoneId.systemDefault());
//        // 使用Duration.between计算时间差，并转换为小时
//        long hoursSincePublish = Duration.between(createTimeLdt, now).toHours();
//
//        // 应用指数衰减公式计算最终热度，确保热度不会衰减为负数，与0取最大的值
//        int heatWithDecay = Math.max((int) (baseHeat * Math.exp(-DECAY_RATE * hoursSincePublish)), 0);
//
//        //更新帖子热度
//        postMapper.updateHotValue(post.getId(), heatWithDecay);
//    }

}
